package com.hxk.juc.thread.CCS;

import java.util.concurrent.CountDownLatch;

/**
 * countDownLatch是什么？
 *     线程计算器，列如火箭发射倒计时，它属具从N減到0
 * countDownLatch类内部维护这一个计数器，只有当计数器==0时，某些线程才会停止阻塞，开始执行
 * 本Case模拟秦始皇灭六国后统一天下的过程
 */
public class CountDownLatchCase {

    public static void main(String[] args) {
        //设置main线程为boss秦国
        Thread.currentThread().setName("秦国");
        //使用CountDownLatch线程计数器，计数灭掉的国家，初始6个国家
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"国，被灭。。。");
                countDownLatch.countDown();//当灭掉一个国家后调用countDownLatch，countDown方法进行--操作，底层使用的volatile+CAS（比较并交换）原理
                },CountDownLatchEnum.getC(i)).start();//这里用到了枚举
        }

        try {
            //当CountDownLatch设置的6个国家都没有灭掉时，main（秦国）线程阻塞在这里等待，当CountDownLatch内部用volatile修饰的state值为0时，继续执行main线程
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()+"，六国已灭，天下统一");
    }

}
